/*
class 类的概念
面向对象，类的概念，怎么使用，之间的继承关系，类的静态方法，静态属性，还有核心功能，对类提供了新的方法，getter和setter方法，可以修改类的实例
*/

{
  //基本定义和生成实例
  class Parent{
    constructor(name='yuanmanxue'){
      this.name=name;
    }
  }

  let v_parent=new Parent('v');
  console.log(v_parent);
}

{
//如何继承
class Parent{
  constructor(name='yuanmanxue'){
    this.name=name;
  }
}
class Son extends Parent{}
console.log('子元素继承',new Son());//Son {name: "yuanmanxue"}

}

{
  //继承，怎么修改参数，怎么传递参数给父级
  class Parent{
    constructor(name='yuanmanxue'){
      this.name=name;
    }
  }
  class Son extends Parent{
    constructor(name='child'){
      //子类向父级传递参数，如果super()  不传参数的话，继承的对象的属性是继承父级的属性的
      super(name);
      //子类中，自定义属性一定要放在super函数的后面  不然会报错
      this.type='child'
    }
  }
  console.log('继承传参',new Son());//_Son {name: "child"}
}

{
  //如何在类中用 getter  setter方法
  class Parent{
    constructor(name='yuanmanxue'){
      this.name=name;
    }
    //这个写法不是方法，是属性
    get longName(){
      return 'mk'+this.name
    }
    set longName(name){
      this.name=name
    }
  }
  let v_son=new Parent();
  console.log('get',v_son.longName);
  v_son.longName='yyyyyyyy';
  console.log('set',v_son.name);
}

{
  //静态方法的定义
  class Parent{
    constructor(name='yuanmanxue'){
      this.name=name;
    }
    //静态方法  是通过类去调用而不是通过类的实例去调用
    static tell(){
      console.log('tell');
    }
  }
  let son=new Parent();
  //son.tell();//直接报错
  Parent.tell();//tell
}

{
  //  静态属性
  class Parent{
    constructor(name='yuanmanxue'){
      this.name=name;
    }
    //静态方法  是通过类去调用而不是通过类的实例去调用
    static tell(){
      console.log('tell');
    }
    //静态属性 没有关键词去定义  怎么去实现 直接在类的构造函数外面定义这个类的一个静态属性就可以的，他的实例是不能够继承的。
  }

  Parent.type='test';
  console.log(Parent.type);//test
  let son=new Parent();
  console.log(son.type);//undefined
}

{
  function Parent(name){
    this.name=name;
    return this
  }
  Parent.age=123;
  Parent.sayHello=function(){
    console.log('hello');
  }
  let son=new Parent('uyyyyy');
  console.log(son.name);//uyyyyy
  console.log(son.age);//undefined
  console.log(Parent.age);//123
  Parent.sayHello();//hello
}
